/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package networkrespnse;

import core.Order;
import core.ParameterDecoder;
import utils.Utils;
/**
 *
 * @author Kvest
 */
public class OrderResponse extends Response
{
    protected Order order;
    private String orderType;
    private String folder;
    
     public OrderResponse(int id)
    {
        super(id);
        orderType = "";
        folder = "";
    }
    
    public OrderResponse(byte[] data)
    {
        super(ORDER_RESPONSE);
        order = new Order(-1);
        orderType = "";
        folder = "";

        parse(data);
    }

    public void createOrder()
    {
        order = new Order(-1);
    }

    protected void parse(byte[] data)
    {
        int offset = 0;
        byte[] body;
        //��������  body
        body = ParameterDecoder.getTransferBody(data);
        
        //Пропускаем название пакета
        byte[] buffer4 = new byte[4];
        System.arraycopy(body, offset, buffer4, 0, buffer4.length);
        offset += buffer4.length + Utils.byteToInt(buffer4);

        parse(body, offset);
    }
    
    public int parse(byte[] data, int index)
    {
        byte[] temp,temp1;
        int size;
        temp = new byte[4];
        //������ �������� - OrderID
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        order = new Order(Utils.byteToInt(temp));

        //������ �������� - RelayID
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        //Не используется Utils.byteToInt(temp);

        //������ �������� - Folder
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        size = Utils.byteToInt(temp);
        temp = new byte[size];
        for (int i=0;i<size;i++)
        {
                temp[i] = data[index++];
        }
        folder = Utils.byteToString(temp);

        //Пропускаем пока   public bool NonCashPay;
        index++;

        //��������� �������� - ClientTypes
        temp = new byte[4];
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        size = Utils.byteToInt(temp);
        temp = new byte[size];
        for (int i=0;i<size;i++)
        {
                temp[i] = data[index++];
        }
        order.setClientType(Utils.byteToString(temp));

        //����� �������� - Date
        temp = new byte[8];
        for (int i=0;i<8;i++)
        {
                temp[i] = data[index++];
        }
        order.setDate(Utils.byteToDate(temp));
 
        //������ �������� - Fare(����)
        temp = new byte[16];
        for (int i=0;i<16;i++)
        {
                temp[i] = data[index++];
        }
        order.setFare(Utils.byteToDecimal(temp));

        //������� �������� - DispatcherName
        temp = new byte[4];
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        size = Utils.byteToInt(temp);
        temp = new byte[size];
        for (int i=0;i<size;i++)
        {
                temp[i] = data[index++];
        }
        order.setDispatcherName(Utils.byteToString(temp));
        
        //������� �������� - PhoneNumber
        temp = new byte[4];
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        size = Utils.byteToInt(temp);
        temp = new byte[size];
        for (int i=0;i<size;i++)
        {
                temp[i] = data[index++];
        }
        order.setPhoneNumber(Utils.byteToString(temp));

        //������� �������� - StreetName
        temp = new byte[4];
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        size = Utils.byteToInt(temp);
        temp = new byte[size];
        for (int i=0;i<size;i++)
        {
                temp[i] = data[index++];
        }
        String adressTmp = Utils.byteToString(temp) + ", ";

        //������� �������� - House
        temp = new byte[4];
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        size = Utils.byteToInt(temp);
        temp = new byte[size];
        for (int i=0;i<size;i++)
        {
                temp[i] = data[index++];
        }
        //Пропускаем пока res[9] = Utils.byteToString(temp);

        //������������ �������� - AddressFact
        temp = new byte[4];
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        size = Utils.byteToInt(temp);
        temp = new byte[size];
        for (int i=0;i<size;i++)
        {
                temp[i] = data[index++];
        }
        adressTmp += format(Utils.byteToString(temp));
        //����������� �������� - Flat
        temp = new byte[4];
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        size = Utils.byteToInt(temp);
        temp = new byte[size];
        for (int i=0;i<size;i++)
        {
                temp[i] = data[index++];
        }
        order.setFlat(Utils.byteToString(temp));
        
        //����� �������� - Entrance
        temp = new byte[4];
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        size = Utils.byteToInt(temp);
        temp = new byte[size];
        for (int i=0;i<size;i++)
        {
                temp[i] = data[index++];
        }
        order.setParade(Utils.byteToString(temp));
        
        //����� �������� - Building
        temp = new byte[4];
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        size = Utils.byteToInt(temp);
        temp = new byte[size];
        for (int i=0;i<size;i++)
        {
                temp[i] = data[index++];
        }
        order.setBuilding(Utils.byteToString(temp));

        //����� �������� -Region
        temp = new byte[4];
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        size = Utils.byteToInt(temp);
        temp = new byte[size];
        for (int i=0;i<size;i++)
        {
                temp[i] = data[index++];
        }
        order.setRegion(Utils.byteToString(temp));

        //����� �������� - BonusSum
        temp = new byte[16];
        for (int i=0;i<16;i++)
        {
                temp[i] = data[index++];
        }
        order.setBonusSum(Utils.byteToDecimal(temp));

        //���������� ��� ��������� GeoX & GeoY
        index += 8;
        //����������� �������� - SubOrders
        //���������� ���������� ��������� � �����
        temp = new byte[4];
        for (int i=0;i<4;i++)
        {
                temp[i] = data[index++];
        }
        int count = Utils.byteToInt(temp);

            //��������������� ������
            String tempString;
            tempString = "";
            temp = new byte[4];

            //������ ������ ������� ���������
            for (int j=0;j<count;j++)
            {
                //��������� �� 4 �����,�.�. ��� ���� ������ ���������.�� ��� �� �����.
                index += 4;
                //�����
                for (int i=0;i<4;i++)
                {
                        temp[i] = data[index++];
                }
                size = Utils.byteToInt(temp);

                temp1 = new byte[size];
                for (int i=0;i<size;i++)
                {
                        temp1[i] = data[index++];
                }
                String tariff = Utils.byteToString(temp1);
                //Tariff              
                if (tariff.equals("БезСуммы"))
                {
                        order.setFare(-1);
                }

                //From - ���� ���� �� ���������
                for (int i=0;i<4;i++)
                {
                        temp[i] = data[index++];
                }
                size = Utils.byteToInt(temp);
                temp1 = new byte[size+4];

                temp1[0] = temp[0];
                temp1[1] = temp[1];
                temp1[2] = temp[2];
                temp1[3] = temp[3];

                for (int i=0;i<size;i++)
                {
                        temp1[i+4] = data[index++];
                }
                //tempString += new String(temp1);                      //���� �� ��� �� ���� �� ���������
                //To
                for (int i=0;i<4;i++)
                {
                        temp[i] = data[index++];
                }
                size = Utils.byteToInt(temp);
                temp1 = new byte[size+4];

                temp1[0] = temp[0];
                temp1[1] = temp[1];
                temp1[2] = temp[2];
                temp1[3] = temp[3];

                for (int i=0;i<size;i++)
                {
                        temp1[i+4] = data[index++];
                }

                if (tariff.equals("Обычный") || tariff.equals("БезСуммы"))
                {
                    tempString += new String(temp1);
                }
                else
                {
                    tempString += new String(Utils.getStringByte(tariff));
                }
                //��������� 4 ��������� ���� float ��� �� �����
                index += 16;
            }
            //Весь список адресов
            order.setAddress(count + 1, (new String(Utils.getStringByte(adressTmp)) + tempString));

            //������������� �������� - OrderType
            for (int i=0;i<4;i++)
            {
                    temp[i] = data[index++];
            }
            size = Utils.byteToInt(temp);
            temp = new byte[size];
            for (int i=0;i<size;i++)
            {
                    temp[i] = data[index++];
            }
            orderType = Utils.byteToString(temp);
            
            //����������� �������� - Comments
            temp = new byte[4];
            for (int i=0;i<4;i++)
            {
                    temp[i] = data[index++];
            }
            size = Utils.byteToInt(temp);
            temp = new byte[size];
            for (int i=0;i<size;i++)
            {
                    temp[i] = data[index++];
            }
            order.setComments(Utils.byteToString(temp));

            //Пропускаем IsAdvanced и uint 
            index++;


            //AutoTariffClassUID
            temp = new byte[4];
            for (int i=0;i<4;i++)
            {
                temp[i] = data[index++];
            }
            order.setAutoTariffClassUID(Utils.byteToInt(temp));

            //PartnerPreffix
            //temp = new byte[4];
            for (int i=0;i<4;i++)
            {
                temp[i] = data[index++];
            }
            size = Utils.byteToInt(temp);
            if (size > 0)
            {
                temp = new byte[size];
                for (int i=0;i<size;i++)
                {
                    temp[i] = data[index++];
                }

                order.setPartnerPreffix(Utils.byteToString(temp));
            }

            //изменяем значение текущего индекса(это параметры, которые идут в конце пакета, но я их не учитываю)
            index += 8;
        
        return index;
    }
   
    public Order getOrder()
    {
        return order;
    }
    
    public String getFolder()
    {
        return folder;
    }
    
    public String getOrderType()
    {
        return orderType;
    }
    
    protected String format(String value)
    {
        if (value == null || value.length() == 0)
        {
            return "";
        }

        String res = "";
        char ch,chn;
        for (int i = 0; i < (value.length() - 1); ++i)
        {
            ch = value.charAt(i);
            chn = value.charAt(i + 1);
            res += ch;
            if ((chn < 48 || chn > 57) && (chn != '/') && (ch >=48 && ch <= 57))
            {
                res += ' ';
            }
        }

        res += value.charAt(value.length() - 1);

        return res;
    }
}
